{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import itertools\n",
    "\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import KFold, StratifiedKFold\n",
    "from sklearn.preprocessing import LabelEncoder, StandardScaler\n",
    "from sklearn.metrics import roc_auc_score, classification_report, confusion_matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_confusion_matrix(cm, classes, title='Confusion matrix', cmap=plt.cm.Blues):\n",
    "\n",
    "    cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n",
    "\n",
    "    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
    "    plt.title(title, fontsize=25)\n",
    "    #plt.colorbar()\n",
    "    tick_marks = np.arange(len(classes))\n",
    "    plt.xticks(tick_marks, classes, rotation=90, fontsize=15)\n",
    "    plt.yticks(tick_marks, classes, fontsize=15)\n",
    "\n",
    "    fmt = '.2f'\n",
    "    thresh = cm.max() / 2.\n",
    "    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
    "        plt.text(j, i, format(cm[i, j], fmt),\n",
    "                 horizontalalignment=\"center\",\n",
    "                 color=\"white\" if cm[i, j] > thresh else \"black\", fontsize = 14)\n",
    "\n",
    "    plt.ylabel('True label', fontsize=20)\n",
    "    plt.xlabel('Predicted label', fontsize=20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(260753, 298)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Original_Quote_Date</th>\n",
       "      <th>QuoteConversion_Flag</th>\n",
       "      <th>Field6</th>\n",
       "      <th>Field7</th>\n",
       "      <th>Field8</th>\n",
       "      <th>Field9</th>\n",
       "      <th>Field10</th>\n",
       "      <th>Field11</th>\n",
       "      <th>Field12</th>\n",
       "      <th>CoverageField1A</th>\n",
       "      <th>...</th>\n",
       "      <th>GeographicField59A</th>\n",
       "      <th>GeographicField59B</th>\n",
       "      <th>GeographicField60A</th>\n",
       "      <th>GeographicField60B</th>\n",
       "      <th>GeographicField61A</th>\n",
       "      <th>GeographicField61B</th>\n",
       "      <th>GeographicField62A</th>\n",
       "      <th>GeographicField62B</th>\n",
       "      <th>GeographicField63</th>\n",
       "      <th>GeographicField64</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>134059</td>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>0</td>\n",
       "      <td>E</td>\n",
       "      <td>8</td>\n",
       "      <td>0.9368</td>\n",
       "      <td>0.0006</td>\n",
       "      <td>1,480</td>\n",
       "      <td>1.2714</td>\n",
       "      <td>N</td>\n",
       "      <td>14</td>\n",
       "      <td>...</td>\n",
       "      <td>7</td>\n",
       "      <td>7</td>\n",
       "      <td>-1</td>\n",
       "      <td>18</td>\n",
       "      <td>-1</td>\n",
       "      <td>7</td>\n",
       "      <td>-1</td>\n",
       "      <td>18</td>\n",
       "      <td>N</td>\n",
       "      <td>IL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>15005</td>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>0</td>\n",
       "      <td>B</td>\n",
       "      <td>23</td>\n",
       "      <td>0.9219</td>\n",
       "      <td>0.0006</td>\n",
       "      <td>965</td>\n",
       "      <td>1.0000</td>\n",
       "      <td>N</td>\n",
       "      <td>25</td>\n",
       "      <td>...</td>\n",
       "      <td>25</td>\n",
       "      <td>25</td>\n",
       "      <td>-1</td>\n",
       "      <td>22</td>\n",
       "      <td>-1</td>\n",
       "      <td>16</td>\n",
       "      <td>-1</td>\n",
       "      <td>17</td>\n",
       "      <td>N</td>\n",
       "      <td>CA</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>43051</td>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>0</td>\n",
       "      <td>J</td>\n",
       "      <td>12</td>\n",
       "      <td>0.9559</td>\n",
       "      <td>0.0004</td>\n",
       "      <td>1,165</td>\n",
       "      <td>1.2392</td>\n",
       "      <td>N</td>\n",
       "      <td>25</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>-1</td>\n",
       "      <td>10</td>\n",
       "      <td>-1</td>\n",
       "      <td>15</td>\n",
       "      <td>-1</td>\n",
       "      <td>15</td>\n",
       "      <td>N</td>\n",
       "      <td>TX</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>103712</td>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>0</td>\n",
       "      <td>J</td>\n",
       "      <td>4</td>\n",
       "      <td>0.9559</td>\n",
       "      <td>0.0004</td>\n",
       "      <td>1,165</td>\n",
       "      <td>1.2392</td>\n",
       "      <td>N</td>\n",
       "      <td>10</td>\n",
       "      <td>...</td>\n",
       "      <td>8</td>\n",
       "      <td>7</td>\n",
       "      <td>-1</td>\n",
       "      <td>16</td>\n",
       "      <td>-1</td>\n",
       "      <td>2</td>\n",
       "      <td>-1</td>\n",
       "      <td>21</td>\n",
       "      <td>N</td>\n",
       "      <td>TX</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>243189</td>\n",
       "      <td>2013-01-01</td>\n",
       "      <td>0</td>\n",
       "      <td>E</td>\n",
       "      <td>23</td>\n",
       "      <td>0.9368</td>\n",
       "      <td>0.0006</td>\n",
       "      <td>1,480</td>\n",
       "      <td>1.2714</td>\n",
       "      <td>N</td>\n",
       "      <td>9</td>\n",
       "      <td>...</td>\n",
       "      <td>10</td>\n",
       "      <td>10</td>\n",
       "      <td>-1</td>\n",
       "      <td>23</td>\n",
       "      <td>-1</td>\n",
       "      <td>8</td>\n",
       "      <td>-1</td>\n",
       "      <td>8</td>\n",
       "      <td>N</td>\n",
       "      <td>IL</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 298 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       Original_Quote_Date  QuoteConversion_Flag Field6  Field7  Field8  \\\n",
       "134059          2013-01-01                     0      E       8  0.9368   \n",
       "15005           2013-01-01                     0      B      23  0.9219   \n",
       "43051           2013-01-01                     0      J      12  0.9559   \n",
       "103712          2013-01-01                     0      J       4  0.9559   \n",
       "243189          2013-01-01                     0      E      23  0.9368   \n",
       "\n",
       "        Field9 Field10  Field11 Field12  CoverageField1A  ...  \\\n",
       "134059  0.0006   1,480   1.2714       N               14  ...   \n",
       "15005   0.0006     965   1.0000       N               25  ...   \n",
       "43051   0.0004   1,165   1.2392       N               25  ...   \n",
       "103712  0.0004   1,165   1.2392       N               10  ...   \n",
       "243189  0.0006   1,480   1.2714       N                9  ...   \n",
       "\n",
       "        GeographicField59A  GeographicField59B  GeographicField60A  \\\n",
       "134059                   7                   7                  -1   \n",
       "15005                   25                  25                  -1   \n",
       "43051                    4                   3                  -1   \n",
       "103712                   8                   7                  -1   \n",
       "243189                  10                  10                  -1   \n",
       "\n",
       "        GeographicField60B  GeographicField61A  GeographicField61B  \\\n",
       "134059                  18                  -1                   7   \n",
       "15005                   22                  -1                  16   \n",
       "43051                   10                  -1                  15   \n",
       "103712                  16                  -1                   2   \n",
       "243189                  23                  -1                   8   \n",
       "\n",
       "        GeographicField62A  GeographicField62B  GeographicField63  \\\n",
       "134059                  -1                  18                  N   \n",
       "15005                   -1                  17                  N   \n",
       "43051                   -1                  15                  N   \n",
       "103712                  -1                  21                  N   \n",
       "243189                  -1                   8                  N   \n",
       "\n",
       "        GeographicField64  \n",
       "134059                 IL  \n",
       "15005                  CA  \n",
       "43051                  TX  \n",
       "103712                 TX  \n",
       "243189                 IL  \n",
       "\n",
       "[5 rows x 298 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### READ DATA ###\n",
    "\n",
    "df = pd.read_csv('QuoteConversion.csv.zip').drop('QuoteNumber', axis=1).sort_values('Original_Quote_Date')\n",
    "df['Original_Quote_Date'] = pd.to_datetime(df.Original_Quote_Date)\n",
    "\n",
    "print(df.shape)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x19ef5525f60>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "### LABEL DISTRIBUTION ###\n",
    "\n",
    "df.QuoteConversion_Flag.value_counts().plot.pie(figsize=(6,6))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "### CREATE FUNCTION FOR CATEGORICAL FEATURES ENCODING ###\n",
    "\n",
    "def encode_cat(df):\n",
    "    \n",
    "    cat_col = (df.select_dtypes(include='category').columns.tolist() + \n",
    "               df.select_dtypes(include='object').columns.tolist())\n",
    "    \n",
    "    for f in cat_col:\n",
    "        lbl = LabelEncoder()\n",
    "        lbl.fit(list(df[f].values))\n",
    "        df[f] = lbl.transform(list(df[f].values))\n",
    "    \n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "### ENCODE CATEGORICAL FEATURES AND FILL NAN VALUES ###\n",
    "\n",
    "df = encode_cat(df)\n",
    "df = df.fillna(-999)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "296"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### GET FEATURES NAMES ###\n",
    "\n",
    "features = df.columns.tolist()\n",
    "\n",
    "features.remove('QuoteConversion_Flag')\n",
    "features.remove('Original_Quote_Date')\n",
    "\n",
    "len(features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "### TEMPORAL TRAIN TEST SPLITTING ###\n",
    "\n",
    "X_train = df[df.Original_Quote_Date <= df.Original_Quote_Date.quantile(0.7)].reset_index(drop=True)\n",
    "y_train = df.QuoteConversion_Flag[df.Original_Quote_Date <= df.Original_Quote_Date.quantile(0.7)].values\n",
    "\n",
    "X_test = df[df.Original_Quote_Date > df.Original_Quote_Date.quantile(0.9)].reset_index(drop=True)\n",
    "y_test = df.QuoteConversion_Flag[df.Original_Quote_Date > df.Original_Quote_Date.quantile(0.9)].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "### GET TIME REFERENCE FROM TRAIN ###\n",
    "\n",
    "Time_train = X_train['Original_Quote_Date'].values"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# BENCHMARK + STRATIFIEDKFOLD"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "### INITIALIZE UTILITY OBJECT AND CROSSVALIDATION SCHEMA ###\n",
    "\n",
    "n_splits = 5\n",
    "\n",
    "yoof = np.zeros(len(X_train))\n",
    "pred = np.zeros(len(X_test))\n",
    "AUC = np.zeros(n_splits)\n",
    "\n",
    "skf = StratifiedKFold(n_splits=n_splits, shuffle=True, random_state=33)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 FOLD\n",
      "AUC 0.83796862288581\n",
      "2 FOLD\n",
      "AUC 0.8351253271130243\n",
      "3 FOLD\n",
      "AUC 0.839458197349332\n",
      "4 FOLD\n",
      "AUC 0.8377466046042376\n",
      "5 FOLD\n",
      "AUC 0.8409666789951422\n",
      "Wall time: 42 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "### TRAIN MODEL ###\n",
    "\n",
    "for fold, (in_index, oof_index) in enumerate(skf.split(X_train, y_train)):\n",
    "    \n",
    "    print(fold+1, 'FOLD')\n",
    "    \n",
    "    scaler = StandardScaler()\n",
    "    pca = PCA(n_components=50, random_state=42)\n",
    "\n",
    "    y_in, y_oof = y_train[in_index], y_train[oof_index]\n",
    "    \n",
    "    X_in = X_train.loc[in_index, features].copy()\n",
    "    X_in = scaler.fit_transform(X_in)\n",
    "    X_in = pca.fit_transform(X_in)\n",
    "    X_oof = X_train.loc[oof_index, features].copy()\n",
    "    X_oof = scaler.transform(X_oof)\n",
    "    X_oof = pca.transform(X_oof)\n",
    "    \n",
    "    model = LogisticRegression(C=0.1, solver=\"lbfgs\", max_iter=1000)\n",
    "    model.fit(X_in, y_in)\n",
    "    \n",
    "    yoof[oof_index] = model.predict_proba(X_oof)[:,1]\n",
    "    pred += model.predict_proba(\n",
    "        pca.transform(\n",
    "            scaler.transform(X_test[features])\n",
    "        ))[:,1]\n",
    "\n",
    "    print('AUC', roc_auc_score(y_oof, yoof[oof_index]))\n",
    "    AUC[fold] = roc_auc_score(y_oof, yoof[oof_index])  \n",
    "\n",
    "    del model; del pca; del scaler\n",
    "        \n",
    "pred = pred/n_splits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8382530861895091"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### OOF AUC ###\n",
    "\n",
    "AUC.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7730245306453186\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.86      0.91      0.89     20879\n",
      "           1       0.48      0.35      0.41      4802\n",
      "\n",
      "    accuracy                           0.81     25681\n",
      "   macro avg       0.67      0.63      0.65     25681\n",
      "weighted avg       0.79      0.81      0.80     25681\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(roc_auc_score(y_test, pred))\n",
    "print(classification_report(y_test, pred>0.5+0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cnf_matrix = confusion_matrix(y_test, pred>0.5+0)\n",
    "plt.figure(figsize=(7,7))\n",
    "plot_confusion_matrix(cnf_matrix, classes=np.unique(y_train), title=\"Confusion matrix\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# PERMUTATION UNDERSAMPLING + KFOLD NO SHUFFLE"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "### INITIALIZE UTILITY OBJECT AND CROSSVALIDATION SCHEMA ###\n",
    "\n",
    "n_splits = 5\n",
    "\n",
    "seeds = range(3)\n",
    "neg_istances = sum(y_train == 1)\n",
    "pos_istances = sum(y_train == 0)\n",
    "\n",
    "yoof = np.zeros((neg_istances*2, len(seeds)))\n",
    "pred = np.zeros((len(X_test), len(seeds)))\n",
    "AUC = np.zeros(len(seeds))\n",
    "\n",
    "skf = KFold(n_splits=n_splits, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 FOLD --- SEED 0\n",
      "AUC 0.8474660156876177\n",
      "2 FOLD --- SEED 0\n",
      "AUC 0.8634358496165428\n",
      "3 FOLD --- SEED 0\n",
      "AUC 0.851811714868587\n",
      "4 FOLD --- SEED 0\n",
      "AUC 0.8700891850565706\n",
      "5 FOLD --- SEED 0\n",
      "AUC 0.85895261042491\n",
      "1 FOLD --- SEED 1\n",
      "AUC 0.8404916163438287\n",
      "2 FOLD --- SEED 1\n",
      "AUC 0.8563731372984171\n",
      "3 FOLD --- SEED 1\n",
      "AUC 0.8498254570816278\n",
      "4 FOLD --- SEED 1\n",
      "AUC 0.8606583194550836\n",
      "5 FOLD --- SEED 1\n",
      "AUC 0.8501963517002146\n",
      "1 FOLD --- SEED 2\n",
      "AUC 0.8333140112278692\n",
      "2 FOLD --- SEED 2\n",
      "AUC 0.8614063437444183\n",
      "3 FOLD --- SEED 2\n",
      "AUC 0.843633097508726\n",
      "4 FOLD --- SEED 2\n",
      "AUC 0.8579794349941625\n",
      "5 FOLD --- SEED 2\n",
      "AUC 0.849187893340843\n",
      "Wall time: 46.9 s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "### TRAIN MODEL ###\n",
    "\n",
    "for s, seed in enumerate(seeds):\n",
    "    \n",
    "    train_pos = X_train.loc[y_train == 1, features].copy()\n",
    "    train_pos['QuoteConversion_Flag'] = [1]*neg_istances\n",
    "    train_pos['Original_Quote_Date'] = Time_train[y_train == 1]\n",
    "    train_neg = X_train.loc[y_train == 0, features].copy()\n",
    "    train_neg['QuoteConversion_Flag'] = [0]*pos_istances\n",
    "    train_neg['Original_Quote_Date'] = Time_train[y_train == 0]\n",
    "    train_neg = train_neg.sample(neg_istances, random_state=seed) #int(pos_istances*0.2)\n",
    "      \n",
    "    train = pd.concat([train_pos,train_neg]).sort_values('Original_Quote_Date')\n",
    "    y = train.QuoteConversion_Flag.values\n",
    "    train = train.drop(['Original_Quote_Date','QuoteConversion_Flag'], axis=1).reset_index(drop=True)\n",
    "    \n",
    "    for fold, (in_index, oof_index) in enumerate(skf.split(train, y)):\n",
    "        \n",
    "        print(fold+1, 'FOLD --- SEED', seed)\n",
    "        \n",
    "        scaler = StandardScaler()\n",
    "        pca = PCA(n_components=50, random_state=seed)\n",
    "        \n",
    "        y_in, y_oof = y[in_index], y[oof_index]\n",
    "        X_in = train.iloc[in_index, :]\n",
    "        X_in = scaler.fit_transform(X_in)\n",
    "        X_in = pca.fit_transform(X_in)\n",
    "        X_oof = train.iloc[oof_index, :]\n",
    "        X_oof = scaler.transform(X_oof)\n",
    "        X_oof = pca.transform(X_oof)\n",
    "        \n",
    "        model = LogisticRegression(C=0.1, solver=\"lbfgs\", max_iter=1000)\n",
    "        model.fit(X_in, y_in)\n",
    "        \n",
    "        yoof[oof_index,s] = model.predict_proba(X_oof)[:,1]\n",
    "        pred[:,s] += model.predict_proba(\n",
    "                        pca.transform(\n",
    "                            scaler.transform(X_test[features])\n",
    "                        ))[:,1]\n",
    "        \n",
    "        print('AUC', roc_auc_score(y_oof, yoof[oof_index,s]))\n",
    "        AUC[s] += roc_auc_score(y_oof, yoof[oof_index,s])  \n",
    "        \n",
    "        del model; del pca; del scaler\n",
    "        \n",
    "pred = pred/n_splits\n",
    "AUC = AUC/n_splits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8529880692232945"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### OOF AUC ###\n",
    "\n",
    "AUC.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8181126595658501\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.94      0.65      0.77     20879\n",
      "           1       0.35      0.83      0.49      4802\n",
      "\n",
      "    accuracy                           0.68     25681\n",
      "   macro avg       0.65      0.74      0.63     25681\n",
      "weighted avg       0.83      0.68      0.72     25681\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(roc_auc_score(y_test, pred.mean(axis=1)))\n",
    "print(classification_report(y_test, pred.mean(axis=1)>0.5+0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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SZKyZpBJkrJmkEmSsmaQSZKyZpBJkrJmkEmSsmaQSZKyZpBJkrJmkEmSsmaQSZKyZpCJ8845my023Yj1112LXXfanltuublm29dee42jjpjAjttuTf+1e/Puvfdaoc1RR0xg7d6xwjB4QL8uXAupPkcftgdTrp7I3NvP4Nbfnshu2765zfb77LIlN170JV645cc8c8OpXHbG0Wyy4bDl03fffhP+OekEnv3n/zHn36cz+Q8n8YWP793VqyEMsjXe5ZddypdP+DwnfvUb3H7Xfey8y64c/N79efrpp6u2b2pqYq211uLYzxzPfge8p2qbH5/xU558ZkaLYaONN+aQQz/Ylasitduh796OH3/lUH74y78z/sOncscDT3LlWZ9h9IiBVduP2WAwl59xNLfe+zjjP3wq7zn2Z6zdtzdX/uy45W1efmURZ198E+868gy2PeR7nPqLv3HScQdw9GF7dNdqrbEMsjXcmT85nY9/YgJHfPootthyS8746c8Y8aY3ccF551Rt369fP3529rkcedTRjBw5qmqbAQMGMGLEiOXD1Cee4MmpU/nUkUd15apI7fa5j72TX//5di784208+uRMTvi/y3l+1nyOqhE6271lNL179eTkn13F1Gdm8cBj0/nRr/7OmzccyuD1iyMN9015hsv/dg9Tpj7PU8/N5pJr7uK626aw23Zt7+lp1Rlka7DFixdz3733sPe73t1i/D77vJvb/31bp73Ohb+8gLeMG8cuu+7aacuUOqp3r55su+Vorv/3Iy3GX/fvRxi/zUZV57nnoadZsrSJT71/V3r0CNZdpy8fO3Bn7n5wGrPnvVx1nm02H8XO22zMzfc83unroJYaHmQRsUlEnBcR90dEU0Tc2Oia1hSzZs2iqamJ4cOHtxg/bPhwZs58vlNeY/78+fzh95fzqSPcG9PqYcjAdenVqycz5yxoMf6FOQsYPni9qvM8PWMO7z3uLE469j3Mv+MnzLz5R4zbZAM+8LlzV2j7+LXfYd4dxXm38y//F7+44pYuWQ+9rlejCwDGAQcAtwN9GlzLmimixdOUEtFqXEdd/Nvf0NTUxEc+9vFOWZ7UaVLLp0GQUqradPjg/pzzrY/yu6vv4LJr72Hdfn355nHv5Tc/PJL9jj6zxXx7H/ET1l2nLzttNZbvfv59TJs+m4v/cldXrskab3UIsj+nlP4E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\n",
      "text/plain": [
       "<Figure size 504x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cnf_matrix = confusion_matrix(y_test, pred.mean(axis=1)>0.5+0)\n",
    "plt.figure(figsize=(7,7))\n",
    "plot_confusion_matrix(cnf_matrix, classes=np.unique(y_train), title=\"Confusion matrix\")\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
